package everyday;

/**
 * @author zhangmin
 * @create 2022-05-06 14:39
 * 剑指 Offer 62. 圆圈中最后剩下的数字
 * 0,1,···,n-1这n个数字排成一个圆圈，从数字0开始，每次从这个圆圈里删除第m个数字（删除后从下一个数字开始计数）。求出这个圆圈里剩下的最后一个数字。
 *
 * 思路：
 * 1、模拟：构建一个长度为n的链表
 * 2、dp[i]表示从0-i每次删除第m个数字最后剩下的数字
 */
public class lastRemaining_offer62 {
    public int lastRemaining(int n, int m) {
        if (n<=0) return -1;
        int[] dp=new int[n+1];
        dp[1]=0;
        for (int i = 2; i <= n; i++) {
            dp[i]=(dp[i-1]+m)%i;
        }
        return dp[n];
    }
}
